iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0

前言

我目前還是沒有辦法解開任何一題 Pwn 的題目(水題例外),所以今天繼續學習~

Buffer Overflow

原理

程式沒有檢查使用者輸入的長度,如果輸入了比定義的 buffer 還長的資料的話,就會造成相鄰記憶體被覆蓋。

常見的原因:

  • 定義的 buffer 不夠大
  • 沒有檢查使用者的輸入
  • 使用了不安全的函數:strcpy()gets(),這些都不會檢查字串長度

以下這個就是容易發生 buffer overflow 的例子:

#include <stdio.h>
#include <string.h>

int main() {
    char input[200];
    printf("請輸入字串:");
    gets(input);  // 這裡使用不檢查輸入字串的長度的 gets() 接收使用者輸入,容易引起 buffer overflow
    char buffer[100];
    strcpy(buffer, input);  // strcpy() 函數也沒有檢查輸入的字串長度
    return 0;
}

Stack-based Buffer Overflow

原理

這邊指的不是遞迴過深造成的那種 stack overflow,Stack-based Buffer Overflow 也是 buffer overflow 的一種,成因也和 buffer overflow 差不多,只是這個 buffer 在 stack 中。

來一個例子:

#include <stdio.h>
#include <string.h>

void vulnerable_function(char *input) {
    char buffer[64];  // stack 上的 buffer,大小為 64 個字元
    strcpy(buffer, input);  // strcpy() 沒有檢查輸入的字串長度
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("請輸入參數\n");
        return 1;
    }
    
    vulnerable_function(argv[1]);
    return 0;
}

Heap Overflow

原理

和 stack 的靜態分配不同,heap 是動態分配的記憶體,並且有一個 Heap Memory Manager 來負責處理 malloc() 或是 free() 之類的操作。因為大小可變的緣故,要讓它 overflow 就要把可使用的空間全部都寫滿。

和 stack-based buffer overflow 比較不同的地方是,heap 上不會有 ret 這類可以控制程式流程的指令,所以也不能用來控制 EIP。

一般來說,heap overflow 比較常利用來:

  • 覆寫物理相鄰的記憶體 chunk 的內容
  • 利用 heap 的機制來達到任意寫(Write-Anything-Anywhere)

Ref: https://bamboofox.cs.nctu.edu.tw/uploads/material/attachment/13/heap_exploit.pdf
這個是 Bamboofox 的簡報,主題是 Heap Exploitation


上一篇
Day 24. Pwn - 保護機制
下一篇
Day 26. Pwn - Pwntools
系列文
進了資安公司當後端 RD 才入門資安會不會太晚了30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言